package uva.sc.ql.evaluator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Observable; import uva.sc.ql.ast.IQLFormNodeVisitor; import uva.sc.ql.ast.IQLStatementNodeVisitor; import uva.sc.ql.atom.ID; import uva.sc.ql.expression.Expression; import uva.sc.ql.form.Form; import uva.sc.ql.gui.helpers.QuestionData; import uva.sc.ql.statements.IfStatement; import uva.sc.ql.statements.Question; import uva.sc.ql.statements.Statement; /** * Visits the AST generating the values table - each change notifies the * listeners (observers) - that contains: * for each question * 1. its expression for calculating the value and * 2. its expression for calculating if it is visible * * @author Pantelis & Santiago */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class QuestionsPropertiesVisitor extends Observable implements IQLStatementNodeVisitor, IQLFormNodeVisitor { private Map<ID, QuestionData> valuesTable = new HashMap<ID, QuestionData>(); private Expression currentIfCondition; public QuestionData questionData(ID id) { return valuesTable.get(id); } public Map<ID, QuestionData> getValuesTable() { return valuesTable; } public void putToValuesTable(ID s, QuestionData d) { valuesTable.put(s, d); setChanged(); notifyObservers(); } public Expression visit(Form questionnaire) { List<Statement> statements = questionnaire.getStatements(); for (Statement statement : statements) { statement.accept(this); } return null; } public Expression visit(Question question) { if (question.getExpr() != null) { putToValuesTable(question.getId(), new QuestionData(question.getExpr(), currentIfCondition)); } else { putToValuesTable(question.getId(), new QuestionData(null, currentIfCondition)); } return null; } public Expression visit(IfStatement ifStatement) { currentIfCondition = ifStatement.getExpr(); List<Question> questions = ifStatement.getQuestions(); for (Question question : questions) question.accept(this); currentIfCondition = null; return null; } }